/*
不带头节点的操作
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// 链式栈节点定义
typedef struct SNode
{
    int data;
    struct SNode *next;
} SNode, *Stack;

// 初始化栈（返回一个空栈）
void InitStack(Stack &S)
{
    S = NULL;
}

// 判断栈是否为空
bool IsEmpty(Stack &S)
{
    if (S == NULL)
    {
        return true;
    }
    else
    {
        return false;
    }
}

// 入栈操作
void Push(Stack &S, int x)
{
    SNode *newNode = (SNode *)malloc(sizeof(SNode));
    if (!newNode)
    {
        printf("内存分配失败！\n");
        exit(-1);
    }
    newNode->data = x;
    newNode->next = S; // 新节点指向原栈顶
    S = newNode;       // 更新栈顶
}

// 出栈操作
bool Pop(Stack &S, int &x)
{
    if (IsEmpty(S))
        return false;

    SNode *temp = S;
    x = temp->data;
    S = temp->next;
    free(temp);
    return true;
}

// 读取栈顶元素但不弹出
bool GetTop(Stack &S, int &x)
{
    if (IsEmpty(S))
        return false;
    x = S->data;
    return true;
}

// 打印栈（从栈顶到底部）
void PrintStack(Stack &S)
{
    printf("栈内容：");
    while (S)
    {
        printf("%d ", S->data);
        S = S->next;
    }
    printf("\n");
}

// 清空栈
void ClearStack(Stack &S)
{
    int temp;
    while (Pop(S, temp))
        ;
}

int main()
{
    Stack s;
    InitStack(s);

    Push(s, 10);
    Push(s, 20);
    Push(s, 30);

    PrintStack(s); // 栈顶应是 30

    int topVal;
    if (GetTop(s, topVal))
    {
        printf("当前栈顶元素：%d\n", topVal);
    }

    int popped;
    if (Pop(s, popped))
    {
        printf("弹出元素：%d\n", popped);
    }

    PrintStack(s); // 应该少了一个

    ClearStack(s);
    printf("栈是否为空：%s\n", IsEmpty(s) ? "是" : "否");

    return 0;
}
